package com.toomoss.USB2XXX;
import java.util.Arrays;
import java.util.List;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;
public interface DBC_PARSER {
    DBC_PARSER INSTANCE  = (DBC_PARSER)Native.loadLibrary("USB2XXX",DBC_PARSER.class);
    //函数返回错误值宏定义
    public static int DBC_PARSER_OK                  = 0;///<函数执行成功
    public static int DBC_PARSER_FILE_OPEN         =(-1);///<打开文件失败
    public static int DBC_PARSER_FILE_FORMAT       =(-2);///<文件格式错误
    public static int DBC_PARSER_DEV_DISCONNECT    =(-3);///<设备未连接
    public static int DBC_PARSER_HANDLE_ERROR      =(-4);///<文件解析句柄错误
    public static int DBC_PARSER_GET_INFO_ERROR    =(-5);///<读取信息错误
    public static int DBC_PARSER_DATA_ERROR        =(-6);///<数据错误

    /**
     * @brief  解析DBC文件
     * @param  DevHandle 通过调用 @ref USB_ScanDevice 获取
     * @param[in]  pDBCFileName DBC文件名称
     * @return 文件解析结果
     * @retval >0 DBC解析句柄，后续函数需要该值
     * @retval =0 文件解析失败
     */
    long DBC_ParserFile(int DevHandle, byte[] pDBCFileName);

    /**
     * @brief  获取DBC文件里面包含的消息帧数
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @return DBC文件包含消息帧数
     */
    int DBC_GetMsgQuantity(long DBCHandle);

    /**
     * @brief  获取消息名称
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param  index 待获取消息名称的索引号，该值不能大于 @ref DBC_GetMsgQuantity 函数返回值
     * @param[out]  pMsgName 消息名称字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_GetMsgName(long DBCHandle, int index, byte[] pMsgName);

    /**
     * @brief  获取帧里面包含的信号数量
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称
     * @return 消息里面包含的信号数量
     */
    int DBC_GetMsgSignalQuantity(long DBCHandle, byte[] pMsgName);

    /**
     * @brief  获取消息里面的信号名称
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param  index 待获取信号名称的索引号值，该值不能大于 @ref DBC_GetMsgSignalQuantity 函数返回值
     * @param[out]  pSignalName 获取到的信号名称
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_GetMsgSignalName(long DBCHandle, byte[] pMsgName, int index, byte[] pSignalName);

    /**
     * @brief  获取指定消息的发布者，也就是发送该消息的节点名称
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[out]  pPublisher 消息发布者名称
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_GetMsgPublisher(long DBCHandle, byte[] pMsgName, byte[] pPublisher);

    /**
     * @brief  设置信号物理值
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param  Value 信号物理值
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_SetSignalValue(long DBCHandle, byte[] pMsgName, byte[] pSignalName, double Value);

    /**
     * @brief  获取信号物理值
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param[out]  pValue 信号物理值指针
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_GetSignalValue(long DBCHandle, byte[] pMsgName, byte[] pSignalName, double[] pValue);

    /**
     * @brief  获取信号值字符串
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[in]  pSignalName 信号名称字符串
     * @param[out]  pValueStr 信号值字符串
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_GetSignalValueStr(long DBCHandle, byte[] pMsgName, byte[] pSignalName, byte[] pValueStr);

    /**
     * @brief  同步CAN消息到DBC解析库里面，同步后可以获取到信号值
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pCANMsg CAN消息指针，消息定义可以参考 @ref CAN_MSG
     * @param  MsgLen 待同步的消息帧数
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_SyncCANMsgToValue(long DBCHandle, USB2CAN.CAN_MSG[] pCANMsg,int MsgLen);

    /**
     * @brief  同步CANFD消息到DBC解析库里面，同步后可以获取到信号值
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pCANFDMsg CAN FD消息指针，消息定义可以参考 @ref CANFD_MSG
     * @param  MsgLen 待同步的消息帧数
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_SyncCANFDMsgToValue(long DBCHandle, USB2CANFD.CANFD_MSG[] pCANFDMsg, int MsgLen);

    /**
     * @brief  同步DBC解析库里面的数据到CAN消息里面
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[out]  pCANMsg CAN消息指针，调用该函数后，该消息里面会包含有效CAN数据，消息定义可以参考 @ref CAN_MSG
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_SyncValueToCANMsg(long DBCHandle, byte[] pMsgName, USB2CAN.CAN_MSG[] pCANMsg);

    /**
     * @brief  同步DBC解析库里面的数据到CANFD消息里面
     * @param  DBCHandle DBC解析句柄，通过调用 @ref DBC_ParserFile 函数获取
     * @param[in]  pMsgName 消息名称字符串
     * @param[out]  pCANFDMsg CANFD消息指针，调用该函数后，该消息里面会包含有效CANFD数据，消息定义可以参考 @ref CANFD_MSG
     * @return 函数执行状态
     * @retval =0 函数执行成功
     * @retval <0 函数调用失败
     */
    int DBC_SyncValueToCANFDMsg(long DBCHandle, byte[] pMsgName, USB2CANFD.CANFD_MSG[] pCANFDMsg);
}
